Remove the ability to list packages in PackageSet
authorAlex Crichton <alex@alexcrichton.com>
Fri, 19 Feb 2016 21:34:27 +0000 (13:34 -0800)
committerAlex Crichton <alex@alexcrichton.com>
Fri, 19 Feb 2016 21:34:27 +0000 (13:34 -0800)
If we download lazily, that's excessively wasteful!

src/cargo/core/package.rs
src/cargo/ops/cargo_clean.rs
src/cargo/ops/cargo_compile.rs
src/cargo/ops/cargo_output_metadata.rs
src/cargo/ops/cargo_rustc/context.rs
src/cargo/ops/cargo_rustc/mod.rs

index 4df81b1624bf83f6fdebe1e558f639fd600b016d..e671a15a60eb83fcb07904945242455429934197 100644 (file)
@@ -1,8 +1,9 @@
 use std::collections::HashMap;
 use std::fmt;
 use std::hash;
-use std::slice;
+use std::iter;
 use std::path::{Path, PathBuf};
+use std::slice;
 use semver::Version;
 
 use core::{Dependency, Manifest, PackageId, SourceId, Target};
@@ -132,8 +133,14 @@ impl<'cfg> PackageSet<'cfg> {
         }
     }
 
-    pub fn packages(&self) -> slice::Iter<Package> {
-        self.packages.iter()
+    pub fn package_ids(&self) -> iter::Map<slice::Iter<Package>,
+                                           fn(&Package) -> &PackageId> {
+        let f = Package::package_id as fn(&Package) -> &PackageId;
+        self.packages.iter().map(f)
+    }
+
+    pub fn get(&self, id: &PackageId) -> &Package {
+        self.packages.iter().find(|pkg| pkg.package_id() == id).unwrap()
     }
 
     pub fn sources(&self) -> &SourceMap<'cfg> {
index 3da7b5e4ba64a078562401dd410fcaaf62b85e96..1359438277d0186f6526a8d13c6d8147f8dfe3f8 100644 (file)
@@ -42,7 +42,7 @@ pub fn clean(manifest_path: &Path, opts: &CleanOptions) -> CargoResult<()> {
     for spec in opts.spec {
         // Translate the spec to a Package
         let pkgid = try!(resolve.query(spec));
-        let pkg = packages.packages().find(|p| p.package_id() == pkgid).unwrap();
+        let pkg = packages.get(&pkgid);
 
         // And finally, clean everything out!
         for target in pkg.targets() {
index 1b7a5b0eab4d05f5b40bdfafec69aa4d2fcd8120..3286db42f775f28d8afd9820323fdaf29750e9eb 100644 (file)
@@ -180,9 +180,7 @@ pub fn compile_pkg<'a>(root_package: &Package,
               invalid_spec.join(", "))
     }
 
-    let to_builds = packages.packages()
-                            .filter(|p| pkgids.contains(&p.package_id()))
-                            .collect::<Vec<_>>();
+    let to_builds = pkgids.iter().map(|id| packages.get(id)).collect::<Vec<_>>();
 
     let mut general_targets = Vec::new();
     let mut package_targets = Vec::new();
index bcc9bc70a881dcf4a5bdcc642d3ae0b686e425fd..7902ea3e953455ae9bb31b71cec3c3e4c862c7fa 100644 (file)
@@ -51,8 +51,13 @@ fn metadata_full(opt: OutputMetadataOptions, config: &Config) -> CargoResult<Exp
                                          opt.no_default_features));
     let (packages, resolve) = deps;
 
+    let packages = packages.package_ids()
+                           .map(|i| packages.get(i))
+                           .cloned()
+                           .collect();
+
     Ok(ExportInfo {
-        packages: packages.packages().cloned().collect(),
+        packages: packages,
         resolve: Some(MetadataResolve(resolve)),
         version: VERSION,
     })
index cc9a0f51df145c13030ccfb27223bc4fc7a1be19..4d7cc115786925f16953ef2ff6fa2f00e4f0b43d 100644 (file)
@@ -560,9 +560,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
 
     /// Gets a package for the given package id.
     pub fn get_package(&self, id: &PackageId) -> &'a Package {
-        self.packages.packages()
-            .find(|pkg| id == pkg.package_id())
-            .expect("Should have found package")
+        self.packages.get(id)
     }
 
     /// Get the user-specified linker for a particular host or target
index 8268eb50db7911e98e86240f1018286dc2f2f745..593f86870a15a7d9be482f972b2265d52e3d9e13 100644 (file)
@@ -79,9 +79,7 @@ pub fn compile_targets<'a, 'cfg: 'a>(pkg_targets: &'a PackagesToBuild<'a>,
     }).collect::<Vec<_>>();
 
     let dest = if build_config.release {"release"} else {"debug"};
-    let root = packages.packages().find(|p| {
-        p.package_id() == resolve.root()
-    }).unwrap();
+    let root = packages.get(resolve.root());
     let host_layout = Layout::new(config, root, None, &dest);
     let target_layout = build_config.requested_target.as_ref().map(|target| {
         layout::Layout::new(config, root, Some(&target), &dest)